2 using System
.Collections
.Generic
;
4 using UnityEngine
.Tilemaps
;
10 public class RuleOverrideTile
: TileBase
13 public class TileSpritePair
15 public Sprite m_OriginalSprite
;
16 public Sprite m_OverrideSprite
;
19 public class OverrideTilingRule
21 public bool m_Enabled
;
22 public RuleTile
.TilingRule m_TilingRule
= new RuleTile
.TilingRule();
25 public Sprite
this[Sprite originalSprite
]
29 foreach (TileSpritePair spritePair
in m_Sprites
)
31 if (spritePair
.m_OriginalSprite
== originalSprite
)
33 return spritePair
.m_OverrideSprite
;
42 m_Sprites
= m_Sprites
.Where(spritePair
=> spritePair
.m_OriginalSprite
!= originalSprite
).ToList();
46 foreach (TileSpritePair spritePair
in m_Sprites
)
48 if (spritePair
.m_OriginalSprite
== originalSprite
)
50 spritePair
.m_OverrideSprite
= value;
54 m_Sprites
.Add(new TileSpritePair()
56 m_OriginalSprite
= originalSprite
,
57 m_OverrideSprite
= value,
62 public RuleTile
.TilingRule
this[RuleTile
.TilingRule originalRule
]
69 int index
= m_Tile
.m_TilingRules
.IndexOf(originalRule
);
72 if (m_OverrideTilingRules
.Count
< index
+ 1)
75 return m_OverrideTilingRules
[index
].m_Enabled
? m_OverrideTilingRules
[index
].m_TilingRule
: null;
82 int index
= m_Tile
.m_TilingRules
.IndexOf(originalRule
);
88 if (m_OverrideTilingRules
.Count
< index
+ 1)
90 m_OverrideTilingRules
[index
].m_Enabled
= false;
91 while (m_OverrideTilingRules
.Count
> 0 && !m_OverrideTilingRules
[m_OverrideTilingRules
.Count
- 1].m_Enabled
)
92 m_OverrideTilingRules
.RemoveAt(m_OverrideTilingRules
.Count
- 1);
96 while (m_OverrideTilingRules
.Count
< index
+ 1)
97 m_OverrideTilingRules
.Add(new OverrideTilingRule());
98 m_OverrideTilingRules
[index
].m_Enabled
= true;
99 m_OverrideTilingRules
[index
].m_TilingRule
= CloneTilingRule(value);
100 m_OverrideTilingRules
[index
].m_TilingRule
.m_Neighbors
= null;
105 public RuleTile m_Tile
;
106 public bool m_Advanced
;
107 public List
<TileSpritePair
> m_Sprites
= new List
<TileSpritePair
>();
108 public List
<OverrideTilingRule
> m_OverrideTilingRules
= new List
<OverrideTilingRule
>();
109 public OverrideTilingRule m_OverrideDefault
= new OverrideTilingRule();
110 public RuleTile
.TilingRule m_OriginalDefault
114 return new RuleTile
.TilingRule()
116 m_Sprites
= new Sprite
[] { m_Tile != null ? m_Tile.m_DefaultSprite : null }
,
117 m_ColliderType
= m_Tile
!= null ? m_Tile
.m_DefaultColliderType
: Tile
.ColliderType
.None
,
122 private RuleTile m_RuntimeTile
;
124 public override bool GetTileAnimationData(Vector3Int position
, ITilemap tilemap
, ref TileAnimationData tileAnimationData
)
128 return m_RuntimeTile
.GetTileAnimationData(position
, tilemap
, ref tileAnimationData
);
130 public override void GetTileData(Vector3Int position
, ITilemap tilemap
, ref TileData tileData
)
134 m_RuntimeTile
.GetTileData(position
, tilemap
, ref tileData
);
136 public override void RefreshTile(Vector3Int position
, ITilemap tilemap
)
140 m_RuntimeTile
.RefreshTile(position
, tilemap
);
142 public override bool StartUp(Vector3Int position
, ITilemap tilemap
, GameObject go
)
145 return m_RuntimeTile
.StartUp(position
, tilemap
, go
);
148 public void ApplyOverrides(IList
<KeyValuePair
<Sprite
, Sprite
>> overrides
)
150 if (overrides
== null)
151 throw new System
.ArgumentNullException("overrides");
153 for (int i
= 0; i
< overrides
.Count
; i
++)
154 this[overrides
[i
].Key
] = overrides
[i
].Value
;
156 public void GetOverrides(List
<KeyValuePair
<Sprite
, Sprite
>> overrides
)
158 if (overrides
== null)
159 throw new System
.ArgumentNullException("overrides");
166 List
<Sprite
> originalSprites
= new List
<Sprite
>();
168 if (m_Tile
.m_DefaultSprite
)
169 originalSprites
.Add(m_Tile
.m_DefaultSprite
);
171 foreach (RuleTile
.TilingRule rule
in m_Tile
.m_TilingRules
)
172 foreach (Sprite sprite
in rule
.m_Sprites
)
173 if (sprite
&& !originalSprites
.Contains(sprite
))
174 originalSprites
.Add(sprite
);
176 foreach (Sprite sprite
in originalSprites
)
177 overrides
.Add(new KeyValuePair
<Sprite
, Sprite
>(sprite
, this[sprite
]));
179 public void ApplyOverrides(IList
<KeyValuePair
<RuleTile
.TilingRule
, RuleTile
.TilingRule
>> overrides
)
181 if (overrides
== null)
182 throw new System
.ArgumentNullException("overrides");
184 for (int i
= 0; i
< overrides
.Count
; i
++)
185 this[overrides
[i
].Key
] = overrides
[i
].Value
;
187 public void GetOverrides(List
<KeyValuePair
<RuleTile
.TilingRule
, RuleTile
.TilingRule
>> overrides
)
189 if (overrides
== null)
190 throw new System
.ArgumentNullException("overrides");
197 foreach (var originalRule
in m_Tile
.m_TilingRules
)
199 RuleTile
.TilingRule overrideRule
= this[originalRule
];
200 overrides
.Add(new KeyValuePair
<RuleTile
.TilingRule
, RuleTile
.TilingRule
>(originalRule
, overrideRule
));
202 overrides
.Add(new KeyValuePair
<RuleTile
.TilingRule
, RuleTile
.TilingRule
>(m_OriginalDefault
, m_OverrideDefault
.m_TilingRule
));
205 public void Override()
207 m_RuntimeTile
= m_Tile
? Instantiate(m_Tile
) : new RuleTile();
208 m_RuntimeTile
.m_Self
= this;
211 if (m_RuntimeTile
.m_DefaultSprite
)
212 m_RuntimeTile
.m_DefaultSprite
= this[m_RuntimeTile
.m_DefaultSprite
];
213 if (m_RuntimeTile
.m_TilingRules
!= null)
214 foreach (RuleTile
.TilingRule rule
in m_RuntimeTile
.m_TilingRules
)
215 for (int i
= 0; i
< rule
.m_Sprites
.Length
; i
++)
216 if (rule
.m_Sprites
[i
])
217 rule
.m_Sprites
[i
] = this[rule
.m_Sprites
[i
]];
221 if (m_OverrideDefault
.m_Enabled
)
223 m_RuntimeTile
.m_DefaultSprite
= m_OverrideDefault
.m_TilingRule
.m_Sprites
.Length
> 0 ? m_OverrideDefault
.m_TilingRule
.m_Sprites
[0] : null;
224 m_RuntimeTile
.m_DefaultColliderType
= m_OverrideDefault
.m_TilingRule
.m_ColliderType
;
226 if (m_RuntimeTile
.m_TilingRules
!= null) {
227 for (int i
= 0; i
< m_RuntimeTile
.m_TilingRules
.Count
; i
++)
229 RuleTile
.TilingRule originalRule
= m_RuntimeTile
.m_TilingRules
[i
];
230 RuleTile
.TilingRule overrideRule
= this[m_Tile
.m_TilingRules
[i
]];
231 if (overrideRule
== null)
233 CopyTilingRule(overrideRule
, originalRule
, false);
238 public RuleTile
.TilingRule
CloneTilingRule(RuleTile
.TilingRule
from)
240 var clone
= new RuleTile
.TilingRule();
241 CopyTilingRule(from, clone
, true);
244 public void CopyTilingRule(RuleTile
.TilingRule
from, RuleTile
.TilingRule to
, bool copyRule
)
248 to
.m_Neighbors
= from.m_Neighbors
;
249 to
.m_RuleTransform
= from.m_RuleTransform
;
251 to
.m_Sprites
= from.m_Sprites
.Clone() as Sprite
[];
252 to
.m_AnimationSpeed
= from.m_AnimationSpeed
;
253 to
.m_PerlinScale
= from.m_PerlinScale
;
254 to
.m_Output
= from.m_Output
;
255 to
.m_ColliderType
= from.m_ColliderType
;
256 to
.m_RandomTransform
= from.m_RandomTransform
;